package core

import (
	"context"
	"fmt"
	"go_test/customProxy"
	"go_test/models"
	"sync"
	"time"
)

// 定时任务管理器
type TaskManager struct {
	timers   map[string]*time.Timer
	contexts map[string]context.CancelFunc // 新增 contexts 字段
	mu       sync.Mutex
}

var defaultManager = &TaskManager{
	timers:   make(map[string]*time.Timer),
	contexts: make(map[string]context.CancelFunc),
}

func DefaultTaskManager() *TaskManager {
	return defaultManager
}

// parseDelay 解析 Delay 字符串为 time.Duration
func parseDelay(delay int) time.Duration {
	if delay == 0 {
		return 5 * time.Second // 默认值
	}

	if delay < 1 {
		return 5 * time.Second // 最小 1 秒
	}
	return time.Duration(delay) * time.Second
}

// StartTask 启动或更新一个定时任务
func (tm *TaskManager) StartTask(link models.LinkReq) {
	tm.mu.Lock()
	defer tm.mu.Unlock()

	// 如果已存在该 linkCode 的定时器，先停止旧任务
	if oldTimer, exists := tm.timers[link.LinkCode]; exists {
		oldTimer.Stop()
		delete(tm.timers, link.LinkCode)
	}
	if cancel, exists := tm.contexts[link.LinkCode]; exists {
		cancel()
		delete(tm.contexts, link.LinkCode)
	}
	fmt.Printf("已清除旧的定时器: %s\n", link.LinkCode)

	// 解析 delay
	delay := parseDelay(link.Delay)

	// 创建 context 用于控制 goroutine 生命周期
	ctx, cancel := context.WithCancel(context.Background())

	// 创建定时器，首次立即执行
	timer := time.AfterFunc(0, func() {
		GoLink(link) // 首次执行

		ticker := time.NewTicker(delay)
		defer ticker.Stop()

		for {
			select {
			case <-ticker.C:
				GoLink(link)
			case <-ctx.Done():
				// 任务被取消，退出 goroutine
				return
			}
		}
	})

	// 缓存 timer 和 cancel 函数
	tm.timers[link.LinkCode] = timer
	tm.contexts[link.LinkCode] = cancel
	fmt.Printf("已启动定时任务: %s，间隔: %v\n", link.LinkCode, delay)
}
func (tm *TaskManager) StopTask(linkCode string) {
	tm.mu.Lock()
	defer tm.mu.Unlock()

	// 1. 停止 Timer
	if timer, exists := tm.timers[linkCode]; exists {
		timer.Stop()
		delete(tm.timers, linkCode)
	}

	// 2. 取消 Context，确保 goroutine 退出
	if cancel, exists := tm.contexts[linkCode]; exists {
		cancel()
		delete(tm.contexts, linkCode)
	}

	fmt.Printf("已停止定时任务: %s\n", linkCode)
}

// IsRunning 判断某个 linkCode 是否正在运行
func (tm *TaskManager) IsRunning(linkCode string) bool {
	tm.mu.Lock()
	defer tm.mu.Unlock()

	_, exists := tm.timers[linkCode]
	return exists
}

func GoLink(link models.LinkReq) {
	fmt.Println("过链接一次:" + link.LinkCode)
	var client, err1 = customProxy.IPIDSocks.CreateClient(link.Region, RandStringBytes(5))
	if err1 != nil {
		fmt.Println("创建proxy失败")
		return
	}
	// 获取一个ua
	var ua = GetUa(link)
	if ua == "" {
		fmt.Println("ua获取失败")
		return
	}
	var ipInfo, err2 = queryIP(client, ua)
	if err2 != nil {
		fmt.Println("查询ip失败")
		return
	}
	println(ipInfo)
}
